/**
 *
 */
package com.rf.richfitwheel.admin.sys.service;

import com.rf.richfitwheel.admin.sys.model.*;
import com.rf.richfitwheel.admin.sys.vo.UserVO;
import com.rf.richfitwheel.common.utils.PageUtils;
import com.rf.richfitwheel.common.utils.TreeUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 机构管理
 * @author hushouquan
 *
 */
public interface OrgService {

    OrgVO getOrgVOById(String id);

    /**
     * 返回机构树，非超级管理员只返回自己租户的数据
     * @param tenantId
     * @return
     * @throws Exception
     */
    List<TreeUtils> getAllOrgTreeUtils(String tenantId) throws Exception;

    /**
     * 返回机构树，超级管理员只返回全部的数据
     * @return
     */
    List<TreeUtils> getAllOrgTreeUtils() throws Exception;

    /**
     * 新增机构信息
     * @param org
     * @param userVO
     */
    void addOrg(Org org, UserVO userVO) throws Exception;

    /**
     * 修改机构信息
     * @param org
     * @param userVO
     */
    void updateOrg(Org org, UserVO userVO);

    /**
     * 删除机构信息
     * @param id
     * @param userVO
     */
    void deleteById(String id, UserVO userVO);

    /**
     * @功能描述: 初始部门
     * @auther: jiaozhongcai
     * @date: 2021/6/3 16:17
     * @param
     * @return: void
     */
    void initOrg();

    /**
     * @功能描述: 更新机构级别
     * @auther: jiaozhongcai
     * @date: 2021/6/3 16:17
     * @param
     * @return: void
     */
    void updateorgLevel();


    List<TreeUtils> getOrgsTreeUtilsIncludeDeptByParentId(String parentId) throws Exception;

    List<TreeUtils> getOrgsTreeUtilsIncludeDeptById(String id) throws Exception;

    List<TreeUtils> getOrgsTreeUtilsExcludeDeptById(String id) throws Exception;

    List<TreeUtils> getOrgsTreeUtilsExcludeDeptByParentId(String parentId) throws Exception;


    /**
     * @功能描述: 根据所在部门id 查询所属机构的机构id
     * @auther: jiaozhongcai
     * @date: 2021/6/9 13:46
     * @param orgId
     * @return: String
     */
    List<Org> getParentOrgByOrgId(String orgId);

    /**
     * 根据所在部门id
     * @param id
     * @return
     */
    Org selectById(String id);

    Org selectByOrgCode(String orgCode);

    EntAndUpperEntVo getEntAndUpperEntInfo(UserVO user);

    PageUtils queryPageEntInfoList(Map<String, Object> params);

    Set<String> getCurrentAndChildrenEntCodeList(UserVO user);

    List<Org> getOrgListByOrgName(Map<String, String> params);

    List<Org> getOrgListByOrgName2(Map<String, String> params);

    List<Org> getOrgListByParams(Map params);


    List<TreeUtils> getOrgsTreeUtilsIncludeByParams(Map params) throws Exception;

    List<Org> getOrgListByOrgCode(String orgCode);

    List<Map<String, Object>> getOrgAndLowerOrgInfoByOrgCode(Map<String, Object> params);

    OrgVO getOrgAndParentOrgByOrgId(String deptId);

    OrgVO getDefaultOrgByUserId(String userId);

    OrgVO getOrgAndParentOrgByOrgCode(String orgCode);

    List<OrgVO> getMngDeptByUserId(String userId);

    //授信专用 获取所属一级机构及所有下级机构信息
    PageUtils queryPageGradeOneAndChildOrg(Map<String, Object> params, UserVO user);
    //授信专用 获取一级企业
    Org getGradeOneOrgByOrgCode(String orgCode);


    //授信专用 获取当前机构及下级所有机构信息
    PageUtils queryPageOrgAndChildOrg(Map<String, Object> params, UserVO user);
    //授信专用 股份或者集团下一级机构
    PageUtils queryPageGradeOneOrg(Map<String, Object> params, UserVO user);
    //查询全部的公司单位
    PageUtils queryOneOrgAll(Map<String, Object> params, UserVO user);
    //授信专用
    Org getGradeOneOrgByOrgId(String orgId);


    //根据机构编码获取本级及下级单位
    List<Org> getCurrentAndBelowOrgListByOrgCode(String orgCode);
    //根据机构编码获取本级及下级单位的编码
    List<String> getCurrentAndBelowOrgCodeListByOrgCode(String orgCode);

    Org getOrgByOrgCode(String orgCode);

    /**
     * 根据条件查询树形结构数据
     * @param org
     * @return
     */
    List<OrgHasChildren> selectByExampleHashChildren(Org org);

    /**
     * 根据机构id查询部门（只有部门）
     *
     * @param id
     * @return
     */
    List<Org> queryDeptByParentId(String id);

    List<Org> queryDeptByParentIdAndName(Map<String, Object> params);

    /**
     * AVIC 根据机构id查询部门（只查子公司，没有部门的概念）
     *
     * @param org Org
     * @return
     */
    List<Org> querySubOrgByParentId(Org org);

    /**
     * 根据机构id查询直接下级机构
     * @param id 机构id
     * @param includeDept 是否包含部门
     * @return
     */
    List<Org> queryOrgsByParentId(String id, boolean includeDept);

    /**
     * 不包含部门的当前管辖树结构
     * @param org
     * @return
     */
    List<OrgHasChildren> selectByExampleHashChildrenExcludeDept(Org org);

    /**
     * 根据传入id查询机构树
     * @param org
     * @return
     */
    List<OrgHasChildren> selectHashChildrenExcludeDept(Org org);
    /**
     * 获取下级单位所有部门信息
     * @param id
     * @return
     */
    List<Map<String,Object>> querySonDeptListByParentOrgId(String id);

    /**
     * 机构迁移
     * @param org
     * @param user
     */
    void changeParent(Org org, UserVO user);

    /**
     * 用户所有管辖单位
     * @param params 其他查询条件
     * @param mngIds 管辖单位的id
     * @return
     */
    PageUtils queryMngListIncludeDept(Map<String, Object> params, List<String> mngIds);

    /**
     * 获取所有机构list
     * @return
     */
    List<Org> getAllOrgCompany();

    /**
     * 根据机构id查询所有下级机构
     * @param org
     * @return
     */
    List<OrgHasChildren> queryOrgsListExcludeDeptByParentId(Org org);


    List<OrgHasChildren> selectAllOrgsByMainId(Map<String,Object>param);

    /**
     * 向上查询直至顶级
     * @param orgIds
     * @return
     */
    List<TreeUtils> getOrgListByOrgIdUpHasSelf(String[] orgIds) throws Exception;

    /**
     * 向上查询直至顶级，不包含自己
     * @param orgIds
     * @return
     */
    List<TreeUtils> getOrgListByOrgIdUpHasNoSelf(String[] orgIds) throws Exception;


    /**
     * @功能描述: 债务融资查询机构数据
     */
    List<Org> queryOneOrgAllList(Map<String, Object> params, UserVO user);

    List<Org> queryOneOrgList(Map<String, Object> params, UserVO user);

    List<Org> findOrgUpList( Map<String, Object> params);

    List<Org> findOrgDeptList(Map<String, Object> params);

    List<Org> getOrgByOrgCodeAll(String orgCode);
    
    /**
     * 所有机构分页查询
     * @param params 查询条件{page,limit,dataForm:{orgCode,orgName}}
     * @return 分页数据
     */
    PageUtils queryAllListIncludeDept(Map<String, Object> params);

    List<Org> getOrgByOrgCodeDownAll(String orgCode);

    HashMap<String, List<Org>> findOrgList(String orgCode);
    
    /**
     * 向上查询直至顶级,不包含自己
     * @param orgId 机构id
     * @return OrgHasParent
     */
    OrgHasParent getOrgListByOrgIdUpHasNoSelfWithTree(String orgId);

    /**
     * 分页查询全量机构
     * @param params {
     *                   'page': pageIndex,
     *                   'limit': pageSize,
     *                   'orgCode': orgCode,
     *                   'orgName': orgName,
     * 				     'orgRank': orgRank,
     * 				     'orgStatus': orgStatus,
     * 				     'orgType': orgType,
     *                }
     * @return 分页结果
     */
    PageUtils queryPageAdmin(Map<String, Object> params);

    /**
     * 将删除状态的机构恢复正常
     * @param id 机构ID
     */
    void rollbackOrg(String id);

    /**
     * 按参数条件返回机构list
     * @return
     */
    List<Org> getOrgListByCondition(Map<String, Object> params);

    /**
     * 根据机构编码更新
     * @param org 机构
     * @param user 用户
     */
    void updateOrgByCode(Org org, UserVO user);

    /**
     * 新增机构，仅新增
     * @param org 机构
     * @param user 用户
     */
    void addOrgOnly(Org org, UserVO user);

    /**
     * 修改机构，仅修改
     * @param org 机构
     * @param user 用户
     */
    void updateOrgOnly(Org org, UserVO user);
}
